{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "eab505f3",
   "metadata": {},
   "source": [
    "Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n",
    "SPDX-License-Identifier: Apache-2.0\n",
    "\n",
    "# Learning Gremlin - Basic Read Queries\n",
    "\n",
    "This notebook is the first in a series of notebooks that walk through how to write queries using Gremlin.  In this notebook, we will examine the basics of Gremlin read queries and how these queries fit into the \"Find\", \"Filter\", \"Format\" paradigm.  Let's begin by loading some sample data into our Neptune cluster.  \n",
    "\n",
    "\n",
    "\n",
    "\n",
    "## Getting Started\n",
    "\n",
    "For these notebooks, we will be leveraging a dataset from the book [Graph Databases in Action](https://www.manning.com/books/graph-databases-in-action?a_aid=bechberger) from Manning Publications.  \n",
    "\n",
    "\n",
    "**Note** These notebooks do not cover data modeling or building a data loading pipeline.  If you would like a more detailed description about how this dataset is constructed and where the design of the data model came from then please read the book.\n",
    "\n",
    "To get started, the first step is to load data into the cluster.  Assuming the cluster is empty, this can be accomplished by running the cell below which will load our Dining By Friends data."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b515ec7d",
   "metadata": {},
   "source": [
    "### Before you begin\n",
    "\n",
    "Throughout all the **Learning Gremlin on Neptune** notebooks, you will notice that each code block starts with either a `%` or `%%` command. These are called *workbench magic* commands, and are essentially shortcuts to specific Neptune APIs. For example:\n",
    "\n",
    "* `%%gremlin` - issues a Gremlin query to the Neptune endpoint using WebSockets\n",
    "* `%seed` - provides a convenient way to add sample data to your Neptune endpoint\n",
    "* `%load` - generates a form that you can use to submit a bulk load request to Neptune\n",
    "\n",
    "For more information on workbench magics, and to see all the supported commands, refer to the [Using Neptune workbench magics in your notebooks](https://docs.aws.amazon.com/neptune/latest/userguide/notebooks-magics.html) user guide."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c569a38",
   "metadata": {},
   "source": [
    "### Loading Data\n",
    "\n",
    "Run the following command to load the sample data set that we'll be using. We'll only need to run this once, and ensure your database is empty before doing so."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "03dd0507",
   "metadata": {},
   "outputs": [],
   "source": [
    "%seed --model property_graph --language gremlin --dataset dining_by_friends --run"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dfa24286",
   "metadata": {},
   "source": [
    "### Setting up the visualizations\n",
    "\n",
    "Run the next two cells to configure various display options for our notebook, which we will use later on to display our results in a pleasing visual way.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6e655017",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%graph_notebook_vis_options\n",
    "{\n",
    "  \"groups\": {    \n",
    "    \"person\": {\n",
    "      \"color\": \"#9ac7bf\"\n",
    "    },\n",
    "    \"review\": {\n",
    "      \"color\": \"#f8cecc\"\n",
    "    },\n",
    "    \"city\": {\n",
    "      \"color\": \"#d5e8d4\"\n",
    "    },\n",
    "    \"state\": {\n",
    "      \"color\": \"#dae8fc\"\n",
    "    },\n",
    "    \"review_rating\": {\n",
    "      \"color\": \"#e1d5e7\"\n",
    "    },\n",
    "    \"restaurant\": {\n",
    "      \"color\": \"#ffe6cc\"\n",
    "    },\n",
    "    \"cuisine\": {\n",
    "      \"color\": \"#fff2cc\"\n",
    "    }\n",
    "  }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de66a832",
   "metadata": {},
   "source": [
    "The following cell creates the `node_labels` object which we use to tell the Notebook which property we want to display when creating graphical visualisations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d5c80800",
   "metadata": {},
   "outputs": [],
   "source": [
    "node_labels = '{\"person\":\"first_name\",\"city\":\"name\",\"state\":\"name\",\"restaurant\":\"name\",\"cuisine\":\"name\"}'"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e51c509",
   "metadata": {},
   "source": [
    "We'll be using the `node_labels` variable to provide a nicer visualisation when running the queries in this notebook. To use it, we need to pass it along with the query itself, as follows:\n",
    "\n",
    "`%%gremlin -d node_labels`\n",
    "\n",
    "The `-d` instructs the notebook as to which properties should be displayed for each specified node label."
   ]
  },
  {
   "attachments": {
    "dining-by-friends.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "48e9a85f",
   "metadata": {},
   "source": [
    "### Looking at our graph data\n",
    "\n",
    "Now that we have loaded our data, let's take a moment to look at what our data model looks like:\n",
    "\n",
    "\n",
    "![dining-by-friends.png](attachment:dining-by-friends.png)\n",
    "\n",
    "<table>\n",
    "    <tr><th colspan=3 style=\"text-align: center\">Element (Node/Edge) Counts</th>\n",
    "    </tr>\n",
    "<tr><td style=\"width:40%\">\n",
    "    \n",
    "|Node Label|Count|\n",
    "|:--|:--|\n",
    "|review|109|\n",
    "|restaurant|40|\n",
    "|cuisine|24|\n",
    "|person|8|\n",
    "|state|2|\n",
    "|city|2|\n",
    "    \n",
    "</td>\n",
    "    <td></td>\n",
    "    <td style=\"width:40%\">\n",
    "\n",
    "|Edge Label|Count|\n",
    "|:--|:--|\n",
    "|wrote|218|\n",
    "|about|218|\n",
    "|within|84|\n",
    "|serves|80|\n",
    "|friends|20|\n",
    "|lives|16|\n",
    "\n",
    "</td></tr> </table>\n",
    "\n",
    "This dataset represents a fictitious, but realistic, restaurant recommendation application that contains:\n",
    "\n",
    "* Users, represented by `person` nodes\n",
    "* Users connected to Users via `friends` edges\n",
    "* Restaurants and their associated information (`city`, `state`, `cuisine`)\n",
    "* Reviews include the body and ratings\n",
    "* Ratings of reviews (helpful/not helpful)\n",
    "\n",
    "This application contains three main aspects to the data it collects.  First, it contains a social network consisting of `person` nodes connected to other `person` nodes via a `friends` edge.  Second, it contains a restaurant review aspect consisting of `restaurant` nodes, information about those restaurants (`city`/`state`/`cuisine`), and `review` nodes for that restaurant.  The third, and final aspect, consists of a personalization component where a `person` can rate a `review`, which allows for better recommendations based on a person's preferences.\n",
    "\n",
    "Throughout this set of notebooks, we will leverage the different aspects of this data to highlight different fundamental types of common property graph queries, namely neighborhood traversals, hierarchies, paths, and collaborative filtering.\n",
    "\n",
    "Now let's get started."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab986dac",
   "metadata": {},
   "source": [
    "\n",
    "## Finding your Data\n",
    "\n",
    "When working with Gremlin, the most common usage of the language is to find data.  Gremlin accomplishes this using the following constructs:\n",
    "\n",
    "* `V()` - used to access nodes in the graph\n",
    "* `E()` - used to access edges in the graph\n",
    "* `has()` - used to filter for objects with a property of a specific value\n",
    "* `hasLabel()` - used to filter for objects with a specific label or labels.\n",
    "\n",
    "To access nodes and edges, you must first get access to the graph itself. In Neptune, this is prebound to a variable called `g`, which is used as the first step in any Gremlin query.\n",
    "\n",
    "Gremlin supports a number of steps that help us traverse the graph. Some of these steps are listed below:\n",
    "\n",
    "#### Gremlin Steps\n",
    "\n",
    "|   Gremlin Steps|Description|\n",
    "|:--|:--|\n",
    "|`both()`|Follow edges in either direction|\n",
    "|`outE()`|Include the outgoing edges in the query (to check a label or property for example)|\n",
    "|`inE()`|Include the incoming edges in the query (to check a label or property for example)|\n",
    "|`bothE()` |Include edges in either direction in the query|\n",
    "|`outV()`|The node on the other end of an outgoing edge|\n",
    "|`inV()`|The node on the other end of an incoming edge|\n",
    "|`otherV()`|The node on the other end of either an outgoing or incoming edge|\n",
    "\n",
    "\n",
    "Now that we have a basic understanding of Gremlin's traversal steps, let's take a look at how this is applied to answer some common graph query patterns.\n",
    "\n",
    "### Finding Nodes\n",
    "\n",
    "The simplest traversal you can do in Gremlin is to search for nodes. In Gremlin traversals, nodes are represented by `V()`. In our example, *review*, *restaurant*, *cuisine*, *person*, *state* and *city* are represented as nodes.\n",
    "\n",
    "Execute the query below to search for all nodes and return them, but limit the number returned to 10."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "deabe58e",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()        //find me all reviews, restaurants, cuisines, persons, states and cities\n",
    ".limit(10)   //return only 10 results\n",
    ".elementMap()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4eee92c8",
   "metadata": {},
   "source": [
    "### Finding Edges\n",
    "\n",
    "The example above works, however it does not leverage the connections within the data, represented by edges in our graph, that make graph databases powerful.  \n",
    "\n",
    "To perform a search across multiple nodes and edges, we need to use our traversal to specify how the nodes and edges are related using the following syntax:\n",
    "\n",
    "\n",
    "|   Gremlin Step|Description|\n",
    "|:--|:--|\n",
    "|`outE()`|Include the outgoing edges in the query (to check a label or property for example)|\n",
    "|`inE()`|Include the incoming edges in the query (to check a label or property for example)|\n",
    "|`bothE()` |Include edges in either direction in the query|\n",
    "\n",
    "Execute the query below to search for node-edge->node patterns described by the `V().inE().outV()` steps, and return 10 results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "168bcc76",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()        //find me all nodes\n",
    ".inE()       //traverse to the incoming edge\n",
    ".outV()      //find the outgoing node\n",
    ".limit(10)   //return only 10 results\n",
    ".elementMap()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d36e1dd",
   "metadata": {},
   "source": [
    "In the example above we specified using incoming edges, using the `inE()` step, but we could have also chosen to look for patterns using only outgoing edges, `outE()`, or ignoring edge direction, `bothE()`.  \n",
    "\n",
    "To build more complex patterns, we can use these basic constructs to link together multiple levels of connections to find more complex patterns.  In the example below, we have extended our previous query to return 10 nodes that have both incoming and outgoing edges, by specifying a `node-edge->node<-edge-node` pattern."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63d548a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()        //find me all nodes\n",
    ".outE()     //traverse the outgoing edges\n",
    ".inV()      //find the node at the end of the edge\n",
    ".inE()      //traverse the incoming edge\n",
    ".outV()     //find the outgoing edge\n",
    ".dedup()     //remove any duplicates\n",
    ".limit(10)  //return only 10 results\n",
    ".elementMap()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3093ad2",
   "metadata": {},
   "source": [
    "We can also do the same using the combination of `bothE()` and `otherV()`, instead of explicitly stating whether to traverse outgoing or incoming edges."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "55f2aaf9",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()        //find me all nodes\n",
    ".bothE()     //traverse both outgoing and incoming edges\n",
    ".otherV()    //find the node at the end of the edge\n",
    ".dedup()     //remove any duplicates\n",
    ".limit(10)  //return only 10 results\n",
    ".elementMap()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f5ef9ca",
   "metadata": {},
   "source": [
    "In the example above, we have returned matches based on a series of connected nodes and edges.  When working with graphs, a series of connected nodes and edges may also be referred to as a 'path'.  Often when we are looking for patterns within our graph we would like to return not just a node or edge within the pattern but the path containing how these items are connected.\n",
    "\n",
    "\n",
    "### Finding Paths\n",
    "\n",
    "To find paths within our graph we can use the constructs we have already learned to specify that we want the path returned. In our previous queries, we started at every node and traversed to the adjacent node using the incoming edge using `inE()`, the outgoing edge using `outE()`, or disregarded the edge direction using `bothE()`. However, we only returned the adjacent node, and not the path.\n",
    "\n",
    "To return the path, we use the `path()` step. This will return traversal information for all paths that have been crossed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1c3736ac",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()        //find me all nodes\n",
    ".bothE()     //traverse both outgoing and incoming edges\n",
    ".otherV()    //find the node at the end of the edge\n",
    ".dedup()     //remove any duplicates\n",
    ".path()      // <-- now return the path\n",
    ".by(elementMap())\n",
    ".limit(10)  //return only 10 results"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "df52d879",
   "metadata": {},
   "source": [
    "## Filtering your Data\n",
    "\n",
    "So far, we have learned how to find specific patterns within our graph based on how the nodes and edges connect.  However, most of the time you will want to use attributes of the nodes and edges to filter the results to return a more specific subset of data.  \n",
    "\n",
    "We accomplish this using the `has()` or `where()` steps. Using the `has()` step filters the traversal based on the existence of a property with a specific value. We can use the `where()` step to filter the traversal based on the existence of a matching traversal. \n",
    "\n",
    "This is an **important** differentiation between the two filtering steps. For example, if you wanted to filter based on the existence of a property, or if a property value matched an arbitrary value, you would use `has()`:\n",
    "\n",
    "`g.V().has('name','Dave')`\n",
    "\n",
    "Alternatively, if you wanted to filter based on a traversal, you would use `where()` instead. For example, if you wanted all nodes with more than 100 outgoing connections, you could use a query such as that below:\n",
    "\n",
    "`g.V().where(out().count().is(gt(100)))`\n",
    "\n",
    "Within both the `has()` and `where()` steps, there are a variety of predicates available to perform logical operations and comparisons of the data. Below is a listing of the some of the predicates supported by Gremlin.\n",
    "\n",
    "### Predicate Functions ###\n",
    "\n",
    "Predicates are functions used to compare values based on equality, ranges or certain patterns. Below is a list of some of the predicates supported by Gremlin. These are implemented in either the [TextP](https://tinkerpop.apache.org/javadocs/current/core/org/apache/tinkerpop/gremlin/process/traversal/TextP.html) or [P](https://tinkerpop.apache.org/javadocs/current/core/org/apache/tinkerpop/gremlin/process/traversal/P.html) traversal classes  \n",
    "\n",
    "|Type|Predicate|\n",
    "| ----------- | ----------- |\n",
    "|General|`within()`, `without()`, `between()`|\n",
    "|Math|`eq()`, `neq()`, `gt()`, `lt()`, `gte()`, `lte()`|\n",
    "|String|`startingWith()`, `endingWith()`, `notStartingWith()`, `notEndingWith()`, `containing()`, `notContaining()`|\n",
    "|Boolean|`and()`, `or()`, `not()`|\n",
    "|Regex|`regex()`, `notRegex()`|\n",
    "\n",
    "### Filtering Steps ###\n",
    "\n",
    "In addition to the predicate functions listed above, Gremlin also supports steps which provide filtering functionality. Below is a list of some of the supported steps:\n",
    "\n",
    "|Gremlin Step|Description|Example|\n",
    "| ----------- | ----------- | ----------- |\n",
    "|`is()`|Filter scalar values|`g.V().values('age).is(32)`|\n",
    "\n",
    "### Reducing Barrier Steps ###\n",
    "\n",
    "Finally, Gremlin supports steps that are defined as `reducing barrier steps`. So what is a Reducing Barrier Step? A full definition can be read in the [official Tinkerpop Apache](https://tinkerpop.apache.org/docs/3.7.0/reference/#a-note-on-barrier-steps), but a shorter explanation is provided below as follows:\n",
    "\n",
    "_\"Gremlin is a lazy stream processing language. This means it will not evaluate data within a traversal until it reaches a step (called a `reducing barrier step`) that requires all the previous traverses to be processed, and a single 'reduced value' traverser to be emitted to the next step.\"_\n",
    "\n",
    "Some examples of `reducing barrier steps` are as follows:\n",
    "\n",
    "|Type|Step\n",
    "| ----------- | ----------- |\n",
    "|List|`fold()`|\n",
    "|Math|`count()`, `sum()`, `max()`, `min()`|\n",
    "|Aggregation|`group()`,`groupCount()`|\n",
    "\n",
    "\n",
    "In the next sections, we will look at some common ways to apply filters using predicates and filtering steps, as well as using barrier steps to modify our return values."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20cf71b1",
   "metadata": {},
   "source": [
    "### Filtering Nodes by Label\n",
    "\n",
    "One of the most common items you will want to filter on will be the label(s) associated with a node. This can be accomplished by using the `hasLabel()` step."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "651a0f21",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".hasLabel('person') // <-- find all person nodes\n",
    ".limit(10)\n",
    ".elementMap()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61f35676",
   "metadata": {},
   "source": [
    "#### Filtering by multiple labels using `hasLabel()`\n",
    "\n",
    "In Property Graph, nodes can have multiple labels associated with them, so you may need to filter across more than one label. You can do this using the example below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0460223d",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".hasLabel('person','restaurant') // <-- filter on the node label, e.g. find all person and restaurant nodes\n",
    ".limit(10)\n",
    ".elementMap()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "51893308",
   "metadata": {},
   "source": [
    "### Filtering Edge by Label\n",
    "Another common item to filter on is the type or label associated with an edge. As with nodes, you can use the `hasLabel()` step associated with an edge."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3b673615",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin -d $node_labels\n",
    "g.V()\n",
    ".hasLabel('person') // <-- find all person nodes\n",
    ".inE()\n",
    "    .hasLabel('friends')  // <-- filter on the edge label\n",
    ".outV()\n",
    ".path()\n",
    ".by(elementMap())\n",
    ".limit(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "52375922",
   "metadata": {},
   "source": [
    "What about if we only wanted to include people who have 2 or more connected friends? We can use some of the predicates we mentioned earlier:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a76e67d6",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin -d $node_labels\n",
    "g.V()\n",
    ".hasLabel('person')\n",
    ".where(out().hasLabel('person').count().is(gte(2))) // <-- filter only people who have 2 or more friend connections\n",
    ".outE()\n",
    "    .hasLabel('friends')\n",
    ".inV()\n",
    ".path()\n",
    ".by(elementMap())\n",
    ".limit(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c5abc463",
   "metadata": {},
   "source": [
    "What if we wanted to get a list of all the restaurants in order to find out which cuisines they serve? After all, all this learning has made me hungry!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7a6a9575",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin -d $node_labels\n",
    "g.V()\n",
    ".hasLabel('restaurant')     // <-- get all the restaurant nodes\n",
    ".out()\n",
    "    .hasLabel('cuisine')    // <-- traverse outwards to the cuisine nodes\n",
    ".path()                     // <-- get the path\n",
    ".by(values('name'))         // <-- return the 'name' property for all nodes in the traversals"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff908e2b",
   "metadata": {},
   "source": [
    "You'll have noticed we used `by()` and `values()` in the above step. This was to be able to format the results to show the `name` property of each of the nodes in the traversal. We'll be explaining how these work in more detail in the **Formatting Results** section below."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d59628b",
   "metadata": {},
   "source": [
    "### Finding by Property\n",
    "\n",
    "The next common use case for filtering is to be able to filter on attribute values. \n",
    "\n",
    "This can be accomplished by using the `has()` step as described above, which applies to both nodes and edges.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e755b029",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()                       // <-- start with all nodes\n",
    ".has('first_name','Dave')   // <-- filter nodes which have a 'first_name' property value of 'Dave'\n",
    ".limit(10)\n",
    ".elementMap()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8b998cd1",
   "metadata": {},
   "source": [
    "Because there are no properties associated to any of our edges, running the following query won't return any records. However, you can use it to see how the same concept of filtering nodes based on properties can be applied to edges."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "098151bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()                   // <-- start with all nodes\n",
    ".outE()                 // <-- traverse the outbound edge, landing on that edge\n",
    ".has('weight', 1)       // <-- filter edges which have a 'weight' property value of '1'\n",
    ".elementMap()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2081d7b4",
   "metadata": {},
   "source": [
    "## Formatting Results\n",
    "\n",
    "Having gone through the basics of finding and filtering data with Gremlin, let's take a look at the last step, formatting our results.  Almost all Gremlin queries will return a value. How this is formatted depends on the traversal and formatting steps.\n",
    "\n",
    "\n",
    "### Returning all values\n",
    "\n",
    "By default, Gremlin will only return the object id in the result set, in the format of `v[<id>]` for nodes and `e[<id>]` for edges. Run the following code to see an example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d1af3bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".hasLabel('person')\n",
    ".limit(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "953027a0",
   "metadata": {},
   "source": [
    "This is great, but isn't particularly useful unless we're pairing it up with data stored elsewhere. Instead, we'd like to retrieve properties about each returned node, and we have three options to be able to do this:\n",
    "\n",
    "* `valueMap()` - returns a map of all the non-internal property values. Use `valueMap().with(WithOptions.tokens)` to include internal properties such as id and label.\n",
    "* `values()` - returns each non-internal property as an individual row.\n",
    "* `elementMap()` - returns a map of ALL property values\n",
    "\n",
    "`valueMap()`, `values()` and `elementMap()` also accept a property name, or list of properties to return, as shown below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ce3ea852",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".hasLabel('person')\n",
    ".values('first_name')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a0442191",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".hasLabel('person')\n",
    ".elementMap('first_name')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8713cbba",
   "metadata": {},
   "source": [
    "**Note**, If you only need to return specific properties from a query, it's recommended that you provide the names of the required properties, so it doesn't return more data than you need."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dae29842",
   "metadata": {},
   "source": [
    "It's important to understand the difference between `valueMap()` and `elementMap()`. Whilst both return properties as a map, they do so in fundamentally different ways.\n",
    "\n",
    "With `valueMap()` all non-internal properties are returned (unless `.with(WithOptions.tokens)` is specified). In addition, all property values are represented as lists, even if there is only a single property value.\n",
    "\n",
    "With `elementMap()` all properties are returned, however unlike `valueMap()` they are not returned as list members. Where you have list or set property containing multiple values, **only the first member is returned**. If you need to return these types of properties, you should use `valueMap()` instead. \n",
    "\n",
    "In addition, when using `elementMap()` with edges, additional information regarding the attached vertices is also returned. The following query demonstrates this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "81c472e9",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "\n",
    "g.V().limit(1).outE().limit(1).elementMap()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05332a49",
   "metadata": {},
   "source": [
    "### Returning property values\n",
    "\n",
    "Most often, you want to be specific about the data elements (node/edges), attributes, or a combination of both, that a query returns.  This provides for efficient processing, both at the database and client level, and efficient data transmission, since we are only retrieving, processing, and sending what is needed.  \n",
    "\n",
    "As we've already seen, Gremlin will only return the results at the end of the traversal, so how do we obtain details of objects that are specified higher up in the traversal? To accomplish this, we can use the `select()` and `project()` steps.\n",
    "\n",
    "#### Selecting and Aliasing\n",
    "\n",
    "We can use `select()` to refer to objects that have been aliased previously in the traversal using the `as()` step. Below is an example of how this is achieved:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9ba582e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".has('first_name','Dave').as('dave')\n",
    ".out()\n",
    ".hasLabel('person').as('friend')\n",
    ".select('dave','friend')\n",
    ".by('first_name')\n",
    ".by('first_name')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc834aed",
   "metadata": {},
   "source": [
    "The above query is quite a jump from our previous examples, so let's breakdown the steps:\n",
    "\n",
    "* `g.V()` - start by looking at all the nodes\n",
    "* `.has('first_name','Dave').as('dave')` - find all nodes with a `first_name` property value of `Dave`. Store these nodes under the alias of `dave`.\n",
    "* `.out().hasLabel('person').as('friend')` - traverse the outgoing edge to an adjacent `person` node. Store these nodes under the alias of `friend`.\n",
    "* `.select('dave','friend')` - refer to the previously aliased traversals using the `select()` step.\n",
    "* `.by('first_name')` - this determines how to format the output of each of the aliased objects. In this case, we're only outputting the `first_name` property for all nodes in the `dave` and `friend` variables."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0452038d",
   "metadata": {},
   "source": [
    "**Note** When using `by()` after a `select()` you must specify the same number of `by()` statements as there are variables in the `select()`. Failing to do so, will cause Gremlin to re-use whichever by() statements have been specified, starting with the first one. Now, this may not always be a problem, as we can see in the next example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ac2eff7d",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".has('first_name','Dave').as('Me')\n",
    ".out()\n",
    ".hasLabel('person').as('MyFriends')\n",
    ".select('Me','MyFriends')\n",
    ".by('first_name')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc56a6d2",
   "metadata": {},
   "source": [
    "The above query is the same as before, however because we only want to return the `first_name` property from nodes in both the `dave` and `friend` aliases, we only need to specify one `by()` modulator.\n",
    "\n",
    "#### Projection\n",
    "\n",
    "Unlike `select()` that aliases previous traversals, the `project()` step takes data from the incoming traversal and moves forward with it. The following example shows how to use `project()` to return the same results as `select()`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "04be1fd9",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".has('first_name','Dave').as(\"Me\")\n",
    ".out()\n",
    "    .hasLabel('person').values('first_name').as(\"MyFriend\")\n",
    ".project('Me','MyFriend')\n",
    "    .by(select(\"Me\").values('first_name'))\n",
    "    .by(select(\"MyFriend\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "943bdceb",
   "metadata": {},
   "source": [
    "Notice in the above query how we've combined `project()` and `select()` to provide us with the same results. This is because we've needed to alias specific portions of the incoming traversal, e.g. the node representing *Dave*, and the nodes representing Dave's *friends*.\n",
    "\n",
    "If we were to run the following query, you'll notice something very odd happen with the results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a8c78c07",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".has('first_name','Dave')\n",
    ".project('Me','MyFriends')\n",
    ".by(values('first_name'))\n",
    ".by(out().hasLabel('person').values('first_name'))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8628c06",
   "metadata": {},
   "source": [
    "The query looks like it should return the `first_name` value of the node representing *Dave*, and then return the `first_name` property of all the outbound `person` nodes associated with Dave. So why didn't it?\n",
    "\n",
    "It's because the first `.has('first_name','Dave')` step created a single traverser. This was the input to the `project()` step. From here, the `.by(out().hasLabel('person').values('first_name'))` step is essentially executing a **sub-query** at this point, which is why it only returns a single row. If you've ever written sub-queries in SQL, you'll know that they're only allowed to return one row, and this query follows the same pattern.\n",
    "\n",
    "So how do we solve this? We can use the `fold()` step to bundle up all the `first_name` values into a single value, and return this instead."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f89c0ba",
   "metadata": {},
   "source": [
    "### Returning unique values\n",
    "\n",
    "To return unique values in the results, we can use the `dedup()` step. This can be used in two ways:\n",
    "\n",
    "* to remove duplicates from the incoming traversal\n",
    "* to only return unique values based on a `by()` modulation\n",
    "\n",
    "Both applications are shown below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c6cf5578",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".hasLabel('person')\n",
    ".both().hasLabel('person')\n",
    ".dedup()\n",
    ".values('first_name')\n",
    ".limit(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c8ab0463",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".hasLabel('person')\n",
    ".dedup()\n",
    ".by('first_name')\n",
    ".values('first_name')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "809468ee",
   "metadata": {},
   "source": [
    "### Returning custom values\n",
    "\n",
    "In addition to returning simple key-value pairs, we can construct more complex responses. This is a common requirement, especially when returning aggregations or when returning attributes from different variables in the matched patterns.\n",
    "\n",
    "These new projections are created by using the `by()` step modulator (which is discussed more in the Loops-Repeats notebook). As we've previously seen, for each traversal step, we write a `by()` step to apply to it. The example below shows how we can return a custom string with the statement \"*person* is friends with *person*\"."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b6d4d8c3",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "g.V()\n",
    ".out().hasLabel('person')\n",
    ".out().hasLabel('person')\n",
    ".path()\n",
    ".by('first_name')\n",
    ".by(constant(' is friends with '))\n",
    ".by('first_name')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "870e2989",
   "metadata": {},
   "source": [
    "## Exercises\n",
    "\n",
    "Now that we have gone through the basics of writing Gremlin read queries, it's time to put it into practice! Below are several exercises you can complete to verify your understanding of the material covered in this notebook.  As practice for what you have learned, please write the Gremlin queries specified below.\n",
    "\n",
    "Using the social network portion (`person` and `friends`) of our Dining By Friends graph, let's answer the following questions:\n",
    "\n",
    "\n",
    "### Exercise 1: Find the first name of Dave's friends\n",
    "\n",
    "Using the data model above, write a query that will:\n",
    "\n",
    "* Find a `person` node(s) with a `first_name` of \"Dave\"\n",
    "* Find the friends of Dave (i.e. traverse the `friends` edge)\n",
    "* Return the friends `first_name`\n",
    "\n",
    "The correct answer is four results: \"Josh\", \"Hank\", \"Kelly\", \"Jim\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ee77c9c6",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f4b6049f",
   "metadata": {},
   "source": [
    "### Exercise 2: Find the first name of the friends of Dave's friends\n",
    "\n",
    "Using the data model above, write a query that will:\n",
    "\n",
    "* Find a `person` node(s) with a `first_name` of \"Dave\"\n",
    "* Find the friends of Dave (i.e. traverse the `friends` edge)\n",
    "* Find the friends of that person (i.e. traverse the `friends` edge)\n",
    "* Return the friends `first_name`\n",
    "\n",
    "The correct answer contains three results: \"Hank\", \"Denise\", \"Paras\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e6cc0978",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "91433ad6",
   "metadata": {},
   "source": [
    "### Exercise 3: Find out how the friends of Dave's friends are connected\n",
    "\n",
    "Using the data model above, write a query that will:\n",
    "\n",
    "* Find a `person` node(s) with a `first_name` of \"Dave\"\n",
    "* Find the friends of Dave (i.e. traverse the `friends` edge)\n",
    "* Find the friends of that person (i.e. traverse the `friends` edge)\n",
    "* Return the path\n",
    "\n",
    "The correct answer contains three results:\n",
    "\n",
    "- `Dave` -> `Josh` -> `Hank`\n",
    "- `Dave` -> `Kelly` -> `Denise`\n",
    "- `Dave` -> `Jim` -> `Paras`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0e7b488b",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c80aba29",
   "metadata": {},
   "source": [
    "### Exercise 4: Which friends should we recommend for Dave?\n",
    "\n",
    "A common use case for graphs in social networks is to recommend new connections.  There is a significant amount of research in this area (example [here](https://www.science.org/doi/10.1126/sciadv.aax7310#:~:text=The%20triadic%20closure%20mechanism%20uses,features%20of%20empirical%20social%20networks)) but mainly there are two prevailing mechanisms at work in social networks that we can leverage to help provide efficient recommendations to a user.  The first of these mechanisms is called homophily, which is the tendency of similar people to be connected.  Homophily is a driving factor in many social networks, with an important outcome being that people connected to you, or connected to people that are connected to you, tend to be similar to you.  This leads to the second mechanism in a graph, the concept of a triadic closure.  Triadic closure is a way to create or recommend new connections based on common friends or acquaintances.  \n",
    "\n",
    "\n",
    "In this exercise, we are going to leverage triadic closure to recommend friends for Dave.  To accomplish this, we will need to leverage the previously written queries but extend them to:\n",
    "\n",
    "* Find all the friends of friends that do not have a connection to Dave\n",
    "\n",
    "The correct answer contains two results: \"Denise\", \"Paras\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fb26d6fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%gremlin\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1f7523f",
   "metadata": {},
   "source": [
    "## Conclusion\n",
    "\n",
    "In this notebook, we explored the basics of writing Gremlin queries and how they are represented in the \"Find\", \"Filter\", \"Format\" paradigm. First, we learned the basics of how to specify the steps used to match on data in our queries. Next, we learned several different mechanisms for how to filter the data found by our queries to return the correct results. Finally, we learned how to specify the format of the data being returned from a query to make for efficient use of database and application resources.\n",
    "\n",
    "In the next notebook, we will take what we have learned in this notebook and extend it to show how to answer questions where the length of the patterns is variable or unknown."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
